/*
 *  Лицензия MIT
 * 
 *  Copyright 2011 Salnikov Aleksey.
 * 
 *  Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения
 *  и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 *  использовать Программное Обеспечение без ограничений, включая неограниченное право
 *  на использование, копирование, изменение, объединение, публикацию, распространение,
 *  сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,
 *  которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
 * 
 *  Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые
 *  части данного Программного Обеспечения.
 * 
 *  ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 *  ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 *  СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ
 *  НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ
 *  ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ
 *  С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 *  ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package look;

import CommonTools.Actions;
import CommonTools.DesignTools;
import CommonTools.Settings;
import Interfaces.ClientInterface;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UnsupportedLookAndFeelException;
import look.elements.DemandTablePanel;

/**
 *
 *
 * @author Salnikov Aleksey
 */
public class SendMessageForm extends JFrame {

    protected final static String CLIENT_SERVER_NAME = "ClientServer";
    protected JTextField themeF;
    protected JTextArea subjectF;
    protected JLabel themeL, subjectL, critL;
    protected JButton send;
    protected JComboBox critF;
    protected JRadioButton veryRb, middleRb, lowRb;
    protected JCheckBox showDemCb;
    private SystemTray systemTray;
    private TrayIcon trayIcon;
    private DemandTablePanel demandPanel;
    private JButton showDemands;
    //Максимальные значения полей
    protected int maxTitle = 120;
    protected int maxSubject = 700;
    protected Color errorColor = Color.RED;
    protected Color normalColor = Color.BLACK;

    //Конструктор
    public SendMessageForm() throws UnsupportedLookAndFeelException
    {
        super("Отправка сообщения | Клиент Ordo");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        /*****************************************************
         * Создаем трей
         ****************************************************/
         /*systemTray = SystemTray.getSystemTray();*/
         ImageIcon icon = new ImageIcon("images/icon.png");
         //trayIcon = new TrayIcon(icon.getImage(), "Клиент Ordo");
         this.setIconImage(icon.getImage());

         /*PopupMenu popup = new PopupMenu();
         MenuItem show = new MenuItem("Отправить заявку");
         MenuItem demands = new MenuItem("Отправленные заявки");
         MenuItem settings = new MenuItem("Настройки");
         MenuItem exit = new MenuItem("Выход");

         popup.add(show);
         popup.add(demands);
         popup.add(settings);
         popup.add(exit);

         //Функция показа окна
         show.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent e)
             {
                showMe();
             }
         });

         //Функция показа окна
         demands.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent e)
             {
                try {
                    showDemands();
                } catch (RemoteException ex) {
                    Logger.getLogger(SendMessageForm.class.getName()).log(Level.SEVERE, null, ex);
                }
             }
         });

         //Функция открытия настроек
         settings.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent e)
             {
                SettingsWindow sw = new SettingsWindow();
             }
         });

         trayIcon.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent e)
             {
                showMe();
             }
         });

         //Функция закрытия приложения
         exit.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent e)
             {
                System.exit(0);
             }
         });

         trayIcon.setPopupMenu(popup);

        try {
            systemTray.add(trayIcon);
        } catch (AWTException ex) {
            DesignTools.showMessage("Ошибка", "Не удается поместить приложение в трей", true);
        }

         /**************************************************
          * Создаем внешний вид
          *************************************************/
        JPanel messagePanel = new JPanel();
        Container c = this.getContentPane();
        c.setLayout(new BorderLayout());
        GridBagLayout gbl = new GridBagLayout();
        gbl.rowWeights = new double [] {0.0, 0.0, 0.1, 0.0, 1.0, Double.MIN_VALUE};
        gbl.columnWeights = new double [] {0.0, 1.0, Double.MIN_VALUE};
        messagePanel.setLayout(gbl);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = gbc.NORTHWEST;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(3,5,0,5);

        themeL = new JLabel("Проблема:");
        subjectL = new JLabel("Подробное описание проблемы:");
        critL = new JLabel("Важность:");
        showDemCb = new JCheckBox("Отобразить заявки");

        gbc.insets = new Insets(10,10, 0 , 10);
        messagePanel.add(themeL, gbc);

        gbc.insets = new Insets(5,10,0,10);
        gbc.gridy = 1;
        messagePanel.add(critL, gbc);

        gbc.gridy = 2;
        messagePanel.add(subjectL, gbc);

        gbc.gridy = 0;
        gbc.gridx = 1;

        themeF = new JTextField();
        gbc.fill = gbc.HORIZONTAL;
        gbc.ipadx = 300;
        gbc.insets = new Insets(7, 0,0,25);

        messagePanel.add(themeF, gbc);

        //Критичность
        gbc.insets = new Insets(3,0,0,25);
        veryRb = new JRadioButton("Высокая");
        middleRb = new JRadioButton("Средняя");
        lowRb = new JRadioButton("Низкая");
        ButtonGroup crit = new ButtonGroup();
        crit.add(veryRb);
        crit.add(middleRb);
        crit.add(lowRb);

        JPanel critPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        critPanel.add(lowRb);
        critPanel.add(middleRb);
        critPanel.add(veryRb);

        gbc.gridy = 1;
        messagePanel.add(critPanel, gbc);

        subjectF = new JTextArea();
        subjectF.setLineWrap(true);
        subjectF.setWrapStyleWord(true);
        JScrollPane scroll = new JScrollPane(subjectF);
        gbc.gridy = 2;
        gbc.fill = gbc.BOTH;
        gbc.ipady = 100;
        //gbc.insets = new Insets(0,0,0,-150);

        messagePanel.add(scroll, gbc);

        send = new JButton("Отправить");
        send.setEnabled(false);
        ImageIcon i = new ImageIcon("images/email.png");
        send.setIcon(i);

        send.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent e)
             {
                sendMessage();
             }
         });

         JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));


         bottomPanel.add(showDemCb);
         bottomPanel.add(send);
         gbc.insets = new Insets(0,0,10,25);
         gbc.ipadx = 0;
         gbc.ipady = 0;
         gbc.anchor = gbc.SOUTHEAST;
         gbc.fill = gbc.NONE;
         gbc.gridy = 3;

         messagePanel.add(bottomPanel, gbc);

         /*****************************************************
         * Добавляем таблицу с заявками
         ****************************************************/
        try {            
            demandPanel = new DemandTablePanel();
            Actions.refreshDemandsTable(demandPanel.getTable());

            gbc.gridwidth = 2;
            gbc.gridx = 0;
            gbc.gridy = 4;
            gbc.anchor = gbc.NORTHWEST;
            gbc.fill = gbc.BOTH;
            gbc.ipady = 50;

            messagePanel.add(demandPanel, gbc);
            demandPanel.setVisible(false);
        } catch (RemoteException ex) {
            Logger.getLogger(SendMessageForm.class.getName()).log(Level.SEVERE, null, ex);
        }

        /******************************************************
         * Привязываем события к полям ввода
         *****************************************************/
        themeF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyTyped(KeyEvent e)
                {
                    titleLengthValid();
                }
            });

        subjectF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyTyped(KeyEvent e)
                {
                    subjectLengthValid();
                }
            });


        showDemCb.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                demandPanel.setVisible(showDemCb.isSelected());
            }
        });

        /*******************************************************
         * Настройка шрифтов и отступов
         ******************************************************/
         Font f = messagePanel.getFont();
         Font titleFont = new Font(f.getName(), Font.BOLD, f.getSize());
         themeF.setFont(titleFont);

         //themeF.setMargin(new Insets(10,10,10,5));

        /********************************************************
         * Последние настройки перед показом
         *******************************************************/

        c.add(messagePanel, BorderLayout.CENTER);

        this.setResizable(false);
        this.setSize(800, 400);
        this.setLocationRelativeTo(null);
        this.setVisible(true);

    }

    protected String getPcName()
    {
        try {
            return InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException ex) {
            DesignTools.showMessage("Сообщение не доставлено", "Не удается получить имя компьютера", false);
            return null;
        }
    }


    protected void sendMessage()
    {
        if (themeF.getForeground().equals(normalColor) && subjectF.getForeground().equals(normalColor))
        {
            String theme = themeF.getText();
            String subject = subjectF.getText();
            String crit = "";

            //Устанавливаем критичность
            if (veryRb.isSelected())
                crit = "Высокая";
            else
                if (lowRb.isSelected())
                    crit = "Низкая";
                else
                    crit = "Средняя";

            String pc = this.getPcName();
            String ip = Settings.getParametrValue("serverip");
            String port = Settings.getParametrValue("serverport");
            String user = System.getProperty("user.name");

            //Теперь используем rmi
            if (!crit.equals(""))
            {
                String serverUrl = "rmi://" + ip + ":" + port + "/" + CLIENT_SERVER_NAME;
                try {
                    ClientInterface client = (ClientInterface) Naming.lookup(serverUrl);
                    client.addDemand(theme, subject, crit, pc, user);
                    themeF.setText("");
                    subjectF.setText("");
                    lowRb.setSelected(false);
                    veryRb.setSelected(false);
                    middleRb.setSelected(false);

                    //Обновляем таблицу заявок
                    Actions.refreshDemandsTable(demandPanel.getTable());
                } catch (NotBoundException ex) {
                    DesignTools.showMessage("Сообщение не отправлено", "Возможно, отключен сервер, или неверные настройки\n"
                            + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
                } catch (MalformedURLException ex) {
                    DesignTools.showMessage("Сообщение не отправлено", "Возможно, отключен сервер, или неверные настройки\n"
                            + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
                } catch (RemoteException ex) {
                    DesignTools.showMessage("Сообщение не отправлено", "Возможно, отключен сервер, или неверные настройки\n"
                            + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
                }
            }
            else
                DesignTools.showMessage("Ошибка", "Выберите важность заявки", true);
        }
        else
            DesignTools.showMessage("Сообщение не доставлено", "В полях, в которых текст красного цвета слишком много символов.\nДля заголовка максимум "
                    +maxTitle+" символов, для основного текста - " + maxSubject+ ".", true);

    }

    protected void showMe()
    {
        this.setVisible(!this.isVisible());
        if (this.isVisible())
        {
            //refreshFields();
            this.setState(JFrame.NORMAL);
        }
        else
            this.setState(JFrame.ICONIFIED);
    }

    protected void titleLengthValid()
    {
        int i = themeF.getText().length();
        if (i > maxTitle)
            themeF.setForeground(errorColor);
        else
            themeF.setForeground(normalColor);
        sendEnabled();
    }

    protected void subjectLengthValid()
    {
        int i = subjectF.getText().length();
        if (i > maxSubject)
            subjectF.setForeground(errorColor);
        else
            subjectF.setForeground(normalColor);
        sendEnabled();
    }

    protected void sendEnabled()
    {
        send.setEnabled((themeF.getText().length() > 0) && (subjectF.getText().length() > 0));
    }

    protected void showDemands() throws RemoteException
    {
        DemandsWindow dw = new DemandsWindow();
    }

}
